<?php

namespace hunma\middleware;

use Webman\Http\Request;
use Webman\Http\Response;
use Webman\MiddlewareInterface;
use Webman\RedisQueue\Client;

class ApiLogMiddleware implements MiddlewareInterface
{
    /**
     * 处理请求并记录日志
     *
     * @param Request $request
     * @param callable $next
     * @return Response
     */
    public function process(Request $request, callable $next): Response
    {
        // 记录请求数据
        $requestData = [
            'method' => $request->method(),
            'uri' => $request->uri(),
            'headers' => $request->header(),
            'query' => $request->get(),
            'body' => $request->rawBody(),
        ];

        // 继续执行后续逻辑
        $response = $next($request);

        // 记录响应数据
        $responseData = [
            'status' => $response->getStatusCode(),
            'headers' => $response->getHeaders(),
            'body' => self::parseResponseBody($response->rawBody()), // 解析响应体
        ];

        // 将日志数据推送到 Redis 队列
        Client::send('api_log_queue', [
            'request' => $requestData,
            'response' => $responseData,
        ]);

        return $response;
    }

    /**
     * 解析响应体中的 JSON 数据
     *
     * @param string $body 响应体的原始内容
     * @return array|string 解析后的 JSON 数据或原始内容
     */
    private static function parseResponseBody(string $body)
    {
        // 尝试解析 JSON 数据
        $decoded = json_decode($body, true);

        // 如果解析成功且没有错误，返回解析后的数据
        if (json_last_error() === JSON_ERROR_NONE) {
            return $decoded;
        }

        // 如果解析失败，返回原始内容
        return $body;
    }
}